package util;

import dao.FuncionarioDAO;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import model.ComandaDetalhe;
import model.Funcionario;
import view.AutorizaProcessoView;

/**
 *
 * @author Silvanei S
 */
public class ComandaDetalheTableModel extends AbstractTableModel{
    
    private AutorizaProcessoView autorizaProcessoView;
    
    private List<ComandaDetalhe> dados;
    private String[] colunas = {
        "<html><font size='5' face='Tahoma'><b>Seq.</b></font></html>", 
        "<html><font size='5' face='Tahoma'><b>Produto</b></font></html>", 
        "<html><font size='5' face='Tahoma'><b>Vlr. Unitário (R$)</b></font></html>", 
        "<html><font size='5' face='Tahoma'><b>Quantidade</b></font></html>", 
        "<html><font size='5' face='Tahoma'><b>Total Item (R$)</b></font></html>"};
    
    public ComandaDetalheTableModel(){        
        dados = new ArrayList<>();
        
        // <editor-fold defaultstate="collapsed" desc="AutorizaProcessoView">
        autorizaProcessoView = new AutorizaProcessoView(new JFrame(), true);
        autorizaProcessoView.addJbConfirmaActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                autorizaProcesso();
            }
        });
        // </editor-fold>
    }
    
    public void addRow(ComandaDetalhe detalhe){
        this.dados.add(detalhe);
        this.fireTableRowsInserted(this.dados.size()-1, this.dados.size()-1);
    }
    
    public synchronized void removeRow(int linha){
        this.dados.remove(linha);
        this.fireTableRowsDeleted(linha, linha);
    }
    
    public ComandaDetalhe get(int linha){
        return this.dados.get(linha);
    }
    
    @Override
    public String getColumnName(int num){
        return this.colunas[num];
    }
    
    @Override
    public int getRowCount() {
        return dados.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(int linha, int coluna) {
        DecimalFormat df = new DecimalFormat("#,##0.00;-#,##0.00");
        
        Integer seq = linha + 1;
        switch(coluna){
            case 0: return seq;
            case 1: return dados.get(linha).getProduto().getDescricao();
            case 2: return df.format(dados.get(linha).getProduto().getVlrVenda());
            case 3: return dados.get(linha).getQuantidade();
            case 4: return df.format(dados.get(linha).getProduto().getVlrVenda().multiply(new BigDecimal(dados.get(linha).getQuantidade())));
        }   
        return null;
    }
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){  
        return columnIndex == 3; 
    }
    
    @Override
    public void setValueAt(Object valor, int linha, int coluna){
        // não aceita valor nulo ou em branco
        if( valor == null || valor.equals("")) {
            return;
        }

        // aceita somente numeros
        String str =(String) valor;
        for( int i = 0; i < str.length(); i++ ) {  
            if( Character.isDigit( str.charAt( i ) ) == false ) {
                return;
            }
        }
        
        autorizaProcessoView.exibe();            
        // somente usuário Gerente pode autorizar
        if(autorizaProcessoView.isAutoriza()){
            switch(coluna){
                case 3:  
                    dados.get(linha).setQuantidade( Integer.parseInt( (String)valor ));
                    break;

            }  
            this.fireTableRowsUpdated(linha, linha);
        }
    }
    
    public void clearRows() {
        int old = dados.size();
        dados.clear();
        fireTableRowsDeleted(0, old);
    }
    
    private void autorizaProcesso(){
        String login = autorizaProcessoView.getLogin();
        String senha = autorizaProcessoView.getSenha();

        FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
        
        // crio o objeto usuário
        Funcionario funcionarioAutoriza = funcionarioDAO.getLoginSenha(login, senha);
        // verifico a permissao
        if(funcionarioAutoriza != null){
            // verifico o tipo de usuário
            if(funcionarioAutoriza.getTipo().equals(1)){
                autorizaProcessoView.setAutoriza(true);
                autorizaProcessoView.setFuncionario(funcionarioAutoriza);
                autorizaProcessoView.dispose();
            }else{
                JOptionPane.showMessageDialog(null, "Usuário Não Autorizado");
            }
        }else{
            JOptionPane.showMessageDialog(null, "Login ou Senha invalido.");
        }
    }
}
